package 链表;

import org.junit.Test;

import java.sql.DriverManager;
import java.util.ArrayList;
import java.util.List;

/**
 * @author aodre , QQ : 480029069
 * @date 2023/2/15 15:27
 */
public class offer24反转链表 {









    public ListNode solve(ListNode head){
        // 这个basecase 可以直接省略！
        if(head == null || head.next == null){
            return head;
        }
        ListNode pre = null, cur = head;
        while(cur != null){
            ListNode temp = cur.next;
            cur.next = pre;
            cur = temp;
        }
        return pre;
    }









    /*
      迭代，
      涉及到指针（引用） 引用类型的 变量 存储的 是 地址 值（ 4 个字节）
      迭代 的最终代码！ ( 非常的  简洁, 链表的 代码 还是非常的 有意思的!)
     */
    public ListNode solution(ListNode head){
        ListNode pre = null , cur = head;
        while(cur != null){
            ListNode temp = cur.next;
            cur.next = pre;
            pre = cur;
            cur = temp;
        }
//        cur.next = pre;
        return pre;
    }

   /*
      递归
    */
    private ListNode ans;
    public ListNode recursion(ListNode node){
        if(node.next == null){
            return ans = node;
        }
        recursion(node.next).next = node;
        /*
         这一步 是 必须 操作的！
         否则 会出现环， 而且在遍历的 时候直接 死循环！
         有点奇怪！
         */
        node.next = null;
        return node;
    }

    class ListNode{
        int val;
        ListNode next;
        public ListNode(int val){
            this.val = val;
        }
    }

    @Test
    public void test(){
        ListNode head = new ListNode(1);
        ListNode node = head;
        for(int i = 2;i <= 5;i++){
            node.next = new ListNode(i);
            node = node.next;
        }
        recursion(head);
        while(ans != null){
            System.out.println(ans.val);
            ans = ans.next;
        }
    }






    //  2023/3/7 号再次 复习


    private ListNode res;
    public ListNode recursionNew(ListNode node){
        if(node.next == null){
            return res = node;
        }
        ListNode temp = recursionNew(node.next);
        temp.next = node;
        /*
          这 把 node.next = null , 因为 你 不置为 null 的话, 已经形成环了!
          那么 遍历该链表的 时候 肯定 死循环的
         */
        node.next = null;
        return node;
    }


    public ListNode solutionNew(ListNode node){
        if(node == null || node.next == null){
            return node;
        }
        ListNode pre = node, cur = node.next;
        while(cur != null){
            ListNode temp = node.next;
            cur.next = pre;
            pre = cur;
            cur = temp;
        }
        return pre;
    }






    public ListNode function(ListNode node){
        if(node == null || node.next == null){
            return node;
        }


        ListNode pre = null, cur = node;
        while(cur != null){
            ListNode temp = cur.next;
            cur.next = pre;
            pre = cur;
            cur = temp;
        }
        return pre;
    }





    @Test
    public void test10(){
        List<Integer> list = new ArrayList<>();
        for(int i = 0;i < list.size();i++){

        }
    }





}
